// =============== 一、常用工具方法封装 START ===============
/**
 * 判断运行环境
 */
const browser = {
    mobile: !!navigator.userAgent.match(/AppleWebKit.*Mobile.*/),
    android: !!navigator.userAgent.match(/Android/ig),
    iphone: !!navigator.userAgent.match(/iPhone|iPod/ig),
    ipad: !!navigator.userAgent.match(/iPad/ig),
    weixin: !!navigator.userAgent.match(/MicroMessenger/ig),
    weibo: !!navigator.userAgent.match(/WeiBo/ig),
    qq: !!navigator.userAgent.match(/QQ/ig)
};

/**
 * ajax封装
 */
/*function request(opt) {
    opt = opt || {};
    //- 访问地址
    opt.url = opt.url || '';
    //- 请求类型
    opt.type = opt.type || 'POST';
    //- 请求参数
    opt.data = opt.data || '';
    //- 异步请求
    opt.async = opt.async || true;

    //- 发送请求前
    opt.beforeSend = opt.beforeSend || function () {};
    //- 请求出现错误
    opt.error = opt.error || function () {};
    //- 操作失败
    opt.fail = opt.fail || function () {};
    //- 操作成功
    opt.success = opt.success || function () {};
    //- 请求完成 - 请求成功或失败时均调用
    opt.complete = opt.complete || function () {};

    //- ajax请求
    $.ajax({
        url: opt.url,
        data: opt.data,
        type: opt.type,
        dataType: "json",
        async: opt.async,
        beforeSend: function (XHR) {
            opt.beforeSend(XHR);
        },
        error: function (e) {
            var response = e.responseText;
            response = $.parseJSON(response);
            opt.error(response);
        },
        success: function (result) {
            if (0 == result.code) {
                //- 正确情况的处理
                opt.success(result.data);
            } else {
                //- 错误情况的处理
                //- 返回状态码和错误信息
                opt.fail(result);
            }
        },
        complete: function (XHR, TS) {
            //- XHR: XMLHttpRequest
            //- TS: textStatus
            opt.complete(XHR, TS);
        }
    });
}*/

/**
 * JavaScript 常用方法整理
 * 开源库：https://github.com/shadowOfCode/bee.js
 */
const utils = {
    //- ES6-对象扩展（方法简写）
    //- method: funcntion() {} 等同于 method() {} 或 method: () => {}

    /**
     * 空判断
     *
     * @param  {String}  val [需判断的值]
     * @return {Boolean}
     */
    empty: (val) => {
        if (val === null || val === 'null') return true;
        if (val === undefined || val === 'undefined') return true;
        if (val === '') return true;
        if (val.length === 0) return true;
        if (!/[^(^\s*)|(\s*$)]/.test(val)) return true;
        return false;
    },

    /**
     * 获取请求地址栏参数
     *
     * @param  {String}  参数名
     * @return {String}  参数值
     */
    param: (name) => {
        var reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`),
            r = window.location.search.substr(1).match(reg);
        return null !== r ? decodeURIComponent(r[2]) : '';
    },

    /**
     * url参数转对象
     *
     * @param  str   请求地址，如：var str = 'http://item.taobao.com/item.html?a=1&b=2&c=&d=xxx&e';
     * @return Array 结果数组：{ a: '1', b: '2', c: '', d: 'xxx' }
     */
    parse: (url) => {
        //- window.location.search：从问号 (?) 开始的 URL
        url = url || window.location.search;
        //- 对编码后的 URI 进行解码
        url = decodeURIComponent(url);
        var result = {};
        url.replace(/([^?&]+)=([^?&]+)/g, function(s, v, k) {
            result[v] = k;
        });
        return result;
    },

    /**
     * 对象序列化
     *
     * @param  {Object} obj [json对象]，如：{name:'json', age: 18}
     * @return {String}     [url参数]   name=json&age=18
     */
    stringify: (obj) => {
        var arr = [];
        for (var key in obj) {
            // arr.push(key + '=' + obj[key]);
            arr.push(`${key}=${obj[key]}`);
        }
        return arr.length ? arr.join('&') : '';
    },

    /**
     * 判断是否为JSON对象
     */
    isJson: (obj) => typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length,

    /**
     * 判断对象是否为空(通过json解析成字符串函数来判断)
     */
    isEmptyObject: (obj) => {
        //- 方法一
        // return !obj || JSON.stringify(obj)=="{}";

        //- 方法二 同jquery的$.isEmptyObject()
        for (var key in obj) {
            return false;
        }
        return true;
    },

    /**
     * 生成UUID
     */
    uuid: () => {
        var d = new Date().getTime();
        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
            //- Math.random()*16 随机产生0-16之间的小数 % 模运算即取余
            var r = (d + Math.random() * 16) % 16 | 0;
            //- round()四舍五入; floor()向上取整; ceil()向下取整
            d = Math.floor(d / 16);
            return (c = 'x' ? r : (r & 0x7 | 0x8)).toString(16);
        })
    },

    /**
     * 生成GUID
     */
    guid: () => {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random() * 16 | 0,
                v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        })
    },

    /**
     * 字节单位转换，转换KB、MB...
     *
     * @param  {String} byte [字节]
     * @return {String}      [转换后的单位]
     */
    byteToSize: (byte) => {
        if (byte === 0) return '0';
        var k = 1024;
        sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
        i = Math.floor(Math.log(byte) / Math.log(k));
        // return (byte / Math.pow(k, i)).toPrecision(4) + sizes[i];
        return (byte / Math.pow(k, i)).toFixed(2) + sizes[i];
    },

    /**
     * 手机号码隐私保护
     * ex：如13800800800 -> 1380****800
     *
     * @param  {String}  手机号
     * @return {String}  处理好的字符串
     */
    phoneHidden: (value) => value.replace(/(\d{3})\d{4}(\d{4})/g, '$1****$2'),

    /**
     * 生成随机颜色
     * @return {String}
     */
    randomColor: () => '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6),

    /**
     * 生成指定范围内随机数
     * @param  {Number} min [最小值]
     * @param  {Number} max [最大值]
     * @return {Number}
     */
    randomNumInRange: (min, max) => Math.floor(min + Math.random() * (max - min)),

    /**
     * 生成指定位数的随机数
     * @param  {Number} num [位数]
     * @return {String}
     */
    ramdomNum: (num = 6) => Math.random().toString().slice(-num),

    /**
     * 生成从0到指定值的数字数组
     * @param  {Integer} max [指定的最大值]
     * @return {Array}
     */
    getNumsArray: (max) => {
        var numbersArray = [];
        for ( var i = 1; numbersArray.push(i++) < max;)
        return numbersArray;
    },

    /**
     * 获取不含参数页面地址
     */
    getPageUrl: () => `${location.origin}${location.pathname}`,
    // getPageUrl: () => location.protocol + '//' + location.host + location.pathname,

    /**
     * 动态插入js
     */
    injectScript: function(src) {
        var s, t;
        s = document.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = src;
        t = document.getElementsByTagName('script')[0];
        t.parentNode.insertBefore(s, t);
    },

    /**
     * 判断浏览器是否支持webP格式图片
     * @return {Boolean}
     */
    isSupportWebP: () => !![].map && document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0,

    /**
     * 检测浏览器是否支持svg
     * @return {Boolean}
     */
    isSupportSVG: () => !!document.createElementNS &&!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect,

    /**
     * 检测浏览器是否支持canvas
     * @return {Boolean}
     */
    isSupportCanvas: () => document.createElement('canvas').getContext,

    /**
     * 获取滚动条距顶部的距离
     */
    getScrollTop: () => (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop
}